/****   request.js   ****/
// 导入axios
import axios from 'axios'
import md5 from './../publics/md5.js'
import { Message } from 'element-ui';
const apiHub = {
  //测试环境
  test: {
    secret: "@4e1efff8980435d2a0b02f687ef1d761", //测试
  },
  //生产环境
  prod: {
    secret: "@4e1efff8980435d2a0b02f687ef1d761", //正式
  }
}
// 区分服务环境
const apiHubkey = apiHub.prod
// 根据传参数组obj，追加appkey，生成签名，并返回加签后的数据，用于网络传输
function getMakePostData(obj) {
  var sign = makeSign(obj).toUpperCase(); //调用app.js的加密方法
  return sign; //返回大写的加密后数据
}
// 鉴权方法
function makeSign(obj) {
  if (!obj) { }
  var str = "";
  var secret = apiHubkey.secret;
  if (!secret) {
    console.log("密钥未获取");
  }
  //生成key升序数组
  var arr = Object.keys(obj);
  arr.sort();
  for (var i in arr) {
    str += arr[i] + "=" + obj[arr[i]];
  }
  var encrypted = md5(str + secret);


  return encrypted;
}
//生成一个公共参数请求实体,给接口请求时使用
function getPublicParams() {
  var paramsData = {
    os: 0,
    channel: "C0009",
    app_id: "web",
    ver: "4.0.0001",
    mobileModel: "",
    m: '',
    b: '',
    did: "XXXXXXXXXXXXXXXXXXX",
    req_t: Date.parse(new Date()),
  };
  return paramsData;
}
//1. 创建新的axios实例，
const service = axios.create({
  baseURL: process.env.VUE_APP_API_BASE_URL,
  // 超时时间 单位是ms，这里设置了30s的超时时间
  // timeout: 3 * 10000
})
// 2.请求拦截器
service.interceptors.request.use(config => {
  var userInfo = JSON.parse(localStorage.getItem('userInfo')); // 获取缓存中的登录信息
  // 判断是否有缓存，有就取值没有就是空，放置清缓存以后找不到userid和t报错问题
  if (userInfo) {
    var userid = userInfo.userid
    var t = userInfo.t
  } else {
    userid = ''
    t = ''
  }
  var paramsData = getPublicParams(); // 获取公共参数
  var paramsInFo = config.params; // 接收传入的参数
  paramsData = Object.assign(paramsData, paramsInFo) // 合并公共参数与传入的参数
  var sign = getMakePostData(paramsData); //鉴权公共参数与传入的参数
  var contentData = {
    "Content-Type": "application/json;charset=utf-8", //设置后端需要的常用的格式就好，特殊情况调用的时候单独设置
    userid: userid, //userid, //'184eb5a95b6a4670a0911475ff2e0ff0'
    t: t, //t, //'8264a668500c4828aacc7f12bbf3e727'
    sign: sign
  }
  var contentType = config.header
  contentData = Object.assign(contentData, contentType)
  config.params = paramsData // 传入的数据
  config.headers = contentData // 传入的请求头
  return config
}, error => {
  Promise.reject(error)
})
// 3.响应拦截器
service.interceptors.response.use(response => {
  //接收到响应数据并成功后的一些共有的处理，关闭loading等
  return response
}, error => {
  /***** 接收到异常响应的处理开始 *****/
  if (error && error.response) {
    // 1.公共错误处理
    // 2.根据响应码具体处理
    switch (error.response.status) {
      case 5:
        error.message = '未登录,请登录'
        break
      case 400:
        error.message = '参数错误'
        break;
      case 401:
        error.message = '鉴权失败'
        break;
      case 403:
        error.message = '拒绝访问'
        break;
      // case 404:
      //   error.message = '请求错误,未找到该资源'
      //   window.location.href = "https://www.honglonglong.net"
      //   break;
      case 405:
        error.message = '请求方法未允许'
        break;
      case 408:
        error.message = '请求超时'
        break;
      case 500:
        error.message = '服务器故障请稍后再试或联系我们:400-8188-191'
        break;
      case 501:
        error.message = '网络未实现'
        break;
      case 502:
        error.message = '网络错误'
        break;
      case 503:
        error.message = '服务不可用'
        break;
      case 504:
        error.message = '网络超时'
        break;
      case 505:
        error.message = 'http版本不支持该请求'
        break;
      default:
        error.message = `连接错误${error.response.status}`
    }
  } else {
    // 超时处理
    if (JSON.stringify(error).includes('timeout')) {
      Message.error('服务器响应超时，请刷新当前页')
    }
    Message.error('连接服务器失败')
  }
  Message.error(error.message)
  /***** 处理结束 *****/
  //如果不需要错误处理，以上的处理过程都可省略
  return Promise.resolve(error.response)
})
//4.导入文件
export default service